/*
 * PasswordStrength.js
 * Copyright(c) 2011 设计蜂巢
	* version: 1.0
 * Date: 2011-10-18 16:38:34
	* Description: 密码强度验证代码，部分代码提取自：https://twitter.com/signup
	  用法：twttr.PasswordStrength.check(password,{username:username,minlength:number,requireStrong:true/false});
			返回：{score:number,msgClass:string}
 * Blog: http://www.hujuntao.com/
 * Update: http://code.google.com/p/hujuntao/
 */
var twttr = {};
indexOf = Array.prototype.indexOf
//inArray
twttr.inArray = function (elem, array) {
    if (!array) {
        return -1;
    }
    if (indexOf) {
        return indexOf.call(array, elem);
    }
    for (var i = 0, length = array.length; i < length; i++) {
        if (array[i] === elem) {
            return i;
        }
    }
    return -1;
}
//map
twttr.map = function (elems, callback, arg) {
    var value, key, ret = [],
        i = 0,
        length = elems.length,
        isArray = length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length - 1]) || length === 0 || typeof elems === "array");
    if (isArray) {
        for (; i < length; i++) {
            value = callback(elems[i], i, arg);
            if (value != null) {
                ret[ret.length] = value;
            }
        }
    } else {
        for (key in elems) {
            value = callback(elems[key], key, arg);
            if (value != null) {
                ret[ret.length] = value;
            }
        }
    }
    return ret.concat.apply([], ret);
}
twttr.BANNED_PASSWORDS = [];
var r = ["000000", "111111", "11111111", "112233", "121212", "123123", "123456", "1234567", "12345678", "123456789", "131313", "232323", "654321", "666666", "696969", "777777", "7777777", "8675309", "987654", "nnnnnn", "nop123", "nop123", "nopqrs", "noteglh", "npprff", "npprff14", "npgvba", "nyoreg", "nyoregb", "nyrkvf", "nyrwnaqen", "nyrwnaqeb", "nznaqn", "nzngrhe", "nzrevpn", "naqern", "naqerj", "natryn", "natryf", "navzny", "nagubal", "ncbyyb", "nccyrf", "nefrany", "neguhe", "nfqstu", "nfqstu", "nfuyrl", "nffubyr", "nhthfg", "nhfgva", "onqobl", "onvyrl", "onanan", "onearl", "onfronyy", "ongzna", "orngevm", "ornire", "ornivf", "ovtpbpx", "ovtqnqql", "ovtqvpx", "ovtqbt", "ovtgvgf", "oveqvr", "ovgpurf", "ovgrzr", "oynmre", "oybaqr", "oybaqrf", "oybjwbo", "oybjzr", "obaq007", "obavgn", "obaavr", "obbobb", "obbtre", "obbzre", "obfgba", "oenaqba", "oenaql", "oenirf", "oenmvy", "oebapb", "oebapbf", "ohyyqbt", "ohfgre", "ohggre", "ohggurnq", "pnyiva", "pnzneb", "pnzreba", "pnanqn", "pncgnva", "pneybf", "pnegre", "pnfcre", "puneyrf", "puneyvr", "purrfr", "puryfrn", "purfgre", "puvpntb", "puvpxra", "pbpnpbyn", "pbssrr", "pbyyrtr", "pbzcnd", "pbzchgre", "pbafhzre", "pbbxvr", "pbbcre", "pbeirggr", "pbjobl", "pbjoblf", "pelfgny", "phzzvat", "phzfubg", "qnxbgn", "qnyynf", "qnavry", "qnavryyr", "qroovr", "qraavf", "qvnoyb", "qvnzbaq", "qbpgbe", "qbttvr", "qbycuva", "qbycuvaf", "qbanyq", "qentba", "qernzf", "qevire", "rntyr1", "rntyrf", "rqjneq", "rvafgrva", "rebgvp", "rfgeryyn", "rkgerzr", "snypba", "sraqre", "sreenev", "sveroveq", "svfuvat", "sybevqn", "sybjre", "sylref", "sbbgonyy", "sberire", "serqql", "serrqbz", "shpxrq", "shpxre", "shpxvat", "shpxzr", "shpxlbh", "tnaqnys", "tngrjnl", "tngbef", "trzvav", "trbetr", "tvnagf", "tvatre", "tvmzbqb", "tbyqra", "tbysre", "tbeqba", "tertbel", "thvgne", "thaare", "unzzre", "unaanu", "uneqpber", "uneyrl", "urngure", "uryczr", "uragnv", "ubpxrl", "ubbgref", "ubearl", "ubgqbt", "uhagre", "uhagvat", "vprzna", "vybirlbh", "vagrearg", "vjnagh", "wnpxvr", "wnpxfba", "wnthne", "wnfzvar", "wnfcre", "wraavsre", "wrerzl", "wrffvpn", "wbuaal", "wbuafba", "wbeqna", "wbfrcu", "wbfuhn", "whavbe", "whfgva", "xvyyre", "xavtug", "ynqvrf", "ynxref", "ynhera", "yrngure", "yrtraq", "yrgzrva", "yrgzrva", "yvggyr", "ybaqba", "ybiref", "znqqbt", "znqvfba", "znttvr", "zntahz", "znevar", "znevcbfn", "zneyobeb", "znegva", "zneiva", "znfgre", "zngevk", "znggurj", "znirevpx", "znkjryy", "zryvffn", "zrzore", "zreprqrf", "zreyva", "zvpunry", "zvpuryyr", "zvpxrl", "zvqavtug", "zvyyre", "zvfgerff", "zbavpn", "zbaxrl", "zbaxrl", "zbafgre", "zbetna", "zbgure", "zbhagnva", "zhssva", "zhecul", "zhfgnat", "anxrq", "anfpne", "anguna", "anhtugl", "app1701", "arjlbex", "avpubynf", "avpbyr", "avccyr", "avccyrf", "byvire", "benatr", "cnpxref", "cnagure", "cnagvrf", "cnexre", "cnffjbeq", "cnffjbeq", "cnffjbeq1", "cnffjbeq12", "cnffjbeq123", "cngevpx", "crnpurf", "crnahg", "crccre", "cunagbz", "cubravk", "cynlre", "cyrnfr", "cbbxvr", "cbefpur", "cevapr", "cevaprff", "cevingr", "checyr", "chffvrf", "dnmjfk", "djregl", "djreglhv", "enoovg", "enpury", "enpvat", "envqref", "envaobj", "enatre", "enatref", "erorppn", "erqfxvaf", "erqfbk", "erqjvatf", "evpuneq", "eboreg", "eboregb", "ebpxrg", "ebfrohq", "ehaare", "ehfu2112", "ehffvn", "fnznagun", "fnzzl", "fnzfba", "fnaqen", "fnghea", "fpbbol", "fpbbgre", "fpbecvb", "fpbecvba", "fronfgvna", "frperg", "frkfrk", "funqbj", "funaaba", "funirq", "fvreen", "fvyire", "fxvccl", "fynlre", "fzbxrl", "fabbcl", "fbppre", "fbcuvr", "fcnaxl", "fcnexl", "fcvqre", "fdhveg", "fevavinf", "fgnegerx", "fgnejnef", "fgrryref", "fgrira", "fgvpxl", "fghcvq", "fhpprff", "fhpxvg", "fhzzre", "fhafuvar", "fhcrezna", "fhesre", "fjvzzvat", "flqarl", "grdhvreb", "gnlybe", "graavf", "grerfn", "grfgre", "grfgvat", "gurzna", "gubznf", "guhaqre", "guk1138", "gvssnal", "gvtref", "gvttre", "gbzpng", "gbctha", "gblbgn", "genivf", "gebhoyr", "gehfgab1", "ghpxre", "ghegyr", "gjvggre", "havgrq", "intvan", "ivpgbe", "ivpgbevn", "ivxvat", "ibbqbb", "iblntre", "jnygre", "jneevbe", "jrypbzr", "jungrire", "jvyyvnz", "jvyyvr", "jvyfba", "jvaare", "jvafgba", "jvagre", "jvmneq", "knivre", "kkkkkk", "kkkkkkkk", "lnznun", "lnaxrr", "lnaxrrf", "lryybj", "mkpioa", "mkpioaz", "mmmmmm"];

twttr.PasswordStrength = (function () {
    function D(E) {
        return (typeof E === "function")
    }
    function C(F, I) {
        var E = "";
        for (var H = 0; H < I.length; H++) {
            var J = true;
            for (var G = 0; G < F && (G + H + F) < I.length; G++) {
                J = J && (I.charAt(G + H) == I.charAt(G + H + F))
            }
            if (G < F) {
                J = false
            }
            if (J) {
                H += F - 1;
                J = false
            } else {
                E += I.charAt(H)
            }
        }
        return E
    }
    return {
        check: function (G, F) {
            var K = 0,
                F = F || {};
            if (G.length < (F.minlength || 6)) {
                return {
                    score: 0,
                    msgClass: "tooshort"
                }
            }
            if (G.match(/\s/)) {
                return {
                    score: 0,
                    msgClass: "whitespace"
                }
            }
            var J = G.toLowerCase();
            if (F.username && J == (D(F.username) ? F.username() : F.username).toLowerCase()) {
                return {
                    score: 0,
                    msgClass: "obvious"
                }
            }
            if (twttr.inArray(J, twttr.BANNED_PASSWORDS || []) != -1) {
                return {
                    score: 0,
                    msgClass: "banned"
                }
            }
            if (F.requireStrong) {
                var E = "# ` ~ ! @ $ % ^ & * ( ) - _ = + [ ] { } | ; : ' \" , . < > / ?".split(" ");
                E = twttr.map(E, function (L) {
                    return "\\" + L
                }).join("");
                var H = ["\\d", "[a-z]", "[A-Z]", "[" + E + "]"];
                var I = twttr.map(H, function (L) {
                    return "(?=.*" + L + ")"
                }).join("");
                if (!G.match(new RegExp("(" + I + "){10,}"))) {
                    return {
                        score: 0,
                        msgClass: "tooweak"
                    }
                }
            }
            K += G.length * 4;
            K += (C(1, G).length - G.length) * 1;
            K += (C(2, G).length - G.length) * 1;
            K += (C(3, G).length - G.length) * 1;
            K += (C(4, G).length - G.length) * 1;
            if (G.match(/(.*[0-9].*[0-9].*[0-9])/)) {
                K += 5
            }
            if (G.match(/(.*[!@#$%^&*?_~].*[!@#$%^&*?_~])/)) {
                K += 5
            }
            if (G.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
                K += 10
            }
            if (G.match(/([a-zA-Z])/) && G.match(/([0-9])/)) {
                K += 15
            }
            if (G.match(/([!@#$%^&*?_~])/) && G.match(/([0-9])/)) {
                K += 15
            }
            if (G.match(/([!@#$%^&*?_~])/) && G.match(/([a-zA-Z])/)) {
                K += 15
            }
            if (G.match(/^\w+$/) || G.match(/^\d+$/)) {
                K -= 10
            }
            if (K < 0) {
                K = 0
            }
            if (K > 100) {
                K = 100
            }
            if (K < 34) {
                return {
                    score: K,
                    msgClass: "weak"
                }
            }
            if (K < 50) {
                return {
                    score: K,
                    msgClass: "good"
                }
            }
            if (K < 75) {
                return {
                    score: K,
                    msgClass: "strong"
                }
            }
            return {
                score: K,
                msgClass: "verystrong"
            }
        }
    }
}());